iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 28
0
自我挑戰組

我的影像視覺定位學習筆記系列 第 28

day28-stereo camera剛體轉換 手眼問題 正交 Procrustes 問題

  • 分享至 

  • xImage
  •  

當我有了影像特徵點的深度資訊之後,
我們就要來回復第一組深度影像與第二組深度影像的運動資訊
(每組深度影像是由兩張平面影像透過視差的關係組合而成),
我們可以透過第一組的左邊相機的影像與第二組左邊相機的影像,
進行特徵點偵測與匹配,從而得出兩群3D點之間的匹配關係。

接下來的問題就會是相機的剛體轉換問題,
這邊就讓我介紹由K. S. Arun等人(1987)提出一種解法並由Eigen的實作

  1. 先計算兩群3D點的中心點
cv::Point3d p1, p2;
size_t N = points1.size();
for (int i = 0; i < N; i++)
{
    p1 += points1[i];
    p2 += points2[i];
}
p1 = cv::Point3d(cv::Vec3d(p1) / (int)N);
p2 = cv::Point3d(cv::Vec3d(p2) / (int)N);

2.將兩群3D點平移使中心點平移到圓心

std::vector<cv::Point3d> q1(N), q2(N);
for (int i = 0; i < N; i++)
{
    q1[i] = points1[i] - p1;
    q2[i] = points2[i] - p2;
}

3.計算相關矩陣

Eigen::Matrix3d W = Eigen::Matrix3d::Zero();
for (int i = 0; i < N; i++) {
    W += Eigen::Vector3d(q1[i].x, q1[i].y, q1[i].z)*Eigen::Vector3d(q2[i].x, q2[i].y, q2[i].z).transpose();
}

4.SVD分解相關矩陣

Eigen::JacobiSVD<Eigen::Matrix3d>svd(W, Eigen::ComputeFullU | Eigen::ComputeFullV);
Eigen::Matrix3d U = svd.matrixU();
Eigen::Matrix3d V = svd.matrixV();

5.組合旋轉矩陣R

Eigen::Matrix3d R_ = V * (U.transpose());//so this rotation is rotate A to B

6.透過中心點求解 位移t

Eigen::Vector3d t_ = Eigen::Vector3d(p2.x, p2.y, p2.z) - R_ * Eigen::Vector3d(p1.x, p1.y, p1.z);

類似的問題在數學正交 Procrustes 問題有興趣的朋友可以深入了解,相關矩陣的數學意義........


上一篇
day27-stereo camera triangulate深度相機 三角測量
下一篇
day29-stereo camera another 解決方案ICP
系列文
我的影像視覺定位學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言